package com.itextpdf.text.io;
import java.io.ByteArrayOutputStream;
import junit.framework.Assert;
import junit.framework.AssertionFailedError;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class GroupedRandomAccessSourceTest {
byte[] data;
@Before
public void setUp() throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (int i = 0; i < 100; i++){
baos.write((byte)i);
}
data = baos.toByteArray();
}
@After
public void tearDown() throws Exception {
}
@Test
public void testGet() throws Exception {
ArrayRandomAccessSource source1 = new ArrayRandomAccessSource(data);
ArrayRandomAccessSource source2 = new ArrayRandomAccessSource(data);
ArrayRandomAccessSource source3 = new ArrayRandomAccessSource(data);
RandomAccessSource[] inputs = new RandomAccessSource[]{
source1, source2, source3
};
GroupedRandomAccessSource grouped = new GroupedRandomAccessSource(inputs);
Assert.assertEquals(source1.length() + source2.length() + source3.length(), grouped.length());
Assert.assertEquals(source1.get(99), grouped.get(99));
Assert.assertEquals(source2.get(0), grouped.get(100));
Assert.assertEquals(source2.get(1), grouped.get(101));
Assert.assertEquals(source1.get(99), grouped.get(99));
Assert.assertEquals(source3.get(99), grouped.get(299));
Assert.assertEquals(-1, grouped.get(300));
}
private byte[] rangeArray(int start, int count){
byte[] rslt = new byte[count];
for(int i = 0; i < count; i++){
rslt[i] = (byte)(i + start);
}
return rslt;
}
private void assertArrayEqual(byte[] a, int offa, byte[] b, int offb, int len){
for(int i = 0; i < len; i++){
if (a[i+offa] != b[i + offb]){
throw new AssertionFailedError("Differ at index " + (i+offa) + " and " + (i + offb) + " -> " + a[i+offa] + " != " + b[i + offb]);
}
}
}
@Test
public void testGetArray() throws Exception {
ArrayRandomAccessSource source1 = new ArrayRandomAccessSource(data); // 0 - 99
ArrayRandomAccessSource source2 = new ArrayRandomAccessSource(data); // 100 - 199
ArrayRandomAccessSource source3 = new ArrayRandomAccessSource(data); // 200 - 299
RandomAccessSource[] inputs = new RandomAccessSource[]{
source1, source2, source3
};
GroupedRandomAccessSource grouped = new GroupedRandomAccessSource(inputs);
byte[] out = new byte[500];
Assert.assertEquals(300, grouped.get(0, out, 0, 300));
assertArrayEqual(rangeArray(0, 100), 0, out, 0, 100);
assertArrayEqual(rangeArray(0, 100), 0, out, 100, 100);
assertArrayEqual(rangeArray(0, 100), 0, out, 200, 100);
Assert.assertEquals(300, grouped.get(0, out, 0, 301));
assertArrayEqual(rangeArray(0, 100), 0, out, 0, 100);
assertArrayEqual(rangeArray(0, 100), 0, out, 100, 100);
assertArrayEqual(rangeArray(0, 100), 0, out, 200, 100);
Assert.assertEquals(100, grouped.get(150, out, 0, 100));
assertArrayEqual(rangeArray(50, 50), 0, out, 0, 50);
assertArrayEqual(rangeArray(0, 50), 0, out, 50, 50);
}
@Test
public void testRelease() throws Exception{
ArrayRandomAccessSource source1 = new ArrayRandomAccessSource(data); // 0 - 99
ArrayRandomAccessSource source2 = new ArrayRandomAccessSource(data); // 100 - 199
ArrayRandomAccessSource source3 = new ArrayRandomAccessSource(data); // 200 - 299
RandomAccessSource[] sources = new RandomAccessSource[]{
source1, source2, source3
};
final RandomAccessSource[] current = new RandomAccessSource[]{null};
final int[] openCount = new int[]{0};
GroupedRandomAccessSource grouped = new GroupedRandomAccessSource(sources){
protected void sourceReleased(RandomAccessSource source) throws java.io.IOException {
openCount[0]--;
if (current[0] != source)
throw new AssertionFailedError("Released source isn't the current source");
current[0] = null;
}
protected void sourceInUse(RandomAccessSource source) throws java.io.IOException {
if (current[0] != null)
throw new AssertionFailedError("Current source wasn't released properly");
openCount[0]++;
current[0] = source;
}
};
grouped.get(250);
grouped.get(251);
Assert.assertEquals(1, openCount[0]);
grouped.get(150);
grouped.get(151);
Assert.assertEquals(1, openCount[0]);
grouped.get(50);
grouped.get(51);
Assert.assertEquals(1, openCount[0]);
grouped.get(150);
grouped.get(151);
Assert.assertEquals(1, openCount[0]);
grouped.get(250);
grouped.get(251);
Assert.assertEquals(1, openCount[0]);
grouped.close();
}
}